package com.foreknow.controller;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 什么是Session
 * Session是服务器端的一种会话技术，服务器在运行的时候可以为每一个用户的数据去创建一个单独的Session对象
 * Session可以为用户浏览器所独享的。所以当在访问Web资源的时候，可以把各自的数据保存到各自的Session中
 *
 * Session的核心类：HttpSession接口  在服务器端保存会话的数据
 * 可以通过req.getSession（）来获取到HttpSession接口
 *
 * getId():获取到Session的一个编号
 * invalidate() 通过此方法可以销毁Session对象
 * setAttribute(java.lang.String name, java.lang.Object value) 向Session中保存数据
 * getAttribute(java.lang.String name)根据name获取到value对象
 * removeAttribute(java.lang.String name) 清除数据 可以在退出登录的时候调用此方法
 *
 * Session执行原理
 * 1.第一次会创建一个Session对象，会给Session对象分配一个唯一的id  （JESSIONID)
 * 2.要将JESSIONID作为Cookie的值发送给浏览器来保存的
 * 3.第二次访问服务器的时候，浏览器会携带JESSIONID的cookie来访问服务器
 * 4.服务器要得到JESSIONID，在服务器端的内存中搜索是否存在对应的Session对象
 *
 * 注意：保存在Session中的数据会被多个Servlet、jsp共享，只要浏览器不关闭，name保存在session中的数据会一直有效（重要）
 */
public class SessionDemo extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();
        //如何获取到Session对象
        HttpSession session = req.getSession();
        //向session中保存数据
        session.setAttribute("name","1234567890");
        //从Session中获取数据
        String name = (String) session.getAttribute("name");
        out.println("JSESSIONID"+session.getId()+"----"+name);

        //手动向客户端写Cookie
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(1*30*24*60*60);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
